/**
*
* 对于从l到r-1的每个i，内循环inner(j)将a[i],....,a[r]中最小的值放入a[i]中，持续地比较交换元素。
* 最小值从右往左一直在比较，就好像“冒泡”到最右边。  
* 就像在选择排序中，坐标i从左到右的遍历。在坐标的左边的元素都是在最终的位置
* /
#include <stdio.h>
#include <stdlib.h>

//考虑移植性的问题，才把类型都定义为Item，这就可以随时改为浮点float都可以
typedef int Item;

#define key(A) (A)
//使用宏的一个好处，不用考虑参数的类型
#define less(A, B) (key(A) < key(B))
#define exch(A, B)  \
    {               \
	Item t = A; \
	A = B;      \
	B = t;      \
    }
#define compexch(A, B) \
    if(less(B, A))     \
    exch(A, B)
void bubbleSort(Item a[], int l, int r)
{
    int i, j;
    for(i=l;i<r;i++){
		for(j=r;j>i;j--)
			compexch(a[j-1],a[j]);
	}
}

main(int argc, char* argv[])
{
    int i, N = atoi(argv[1]), sw = atoi(argv[2]),j=0;
    int* a = malloc(N * sizeof(int));
	printf("%d items\n",N);
    if(sw)
	for(i = 0; i < N; i++) {
	    a[i] = 1000 * (1.0 * rand() / RAND_MAX);
		printf("%d item is %d\n",i,a[i]);
	}
    else
/** 不知道是不是我的知识不够，书本上的例子这段代码运行不起来
	while(scanf("%d", &a[N]) == 1)
	    N++; 
		 */
	while(j<N){
		scanf("%d",&a[j++]);
	}
	//2.调用冒泡排序的函数对这些整型进行排序
    bubbleSort(a, 0, N - 1);
	//3.输出排序后的结果
    for(i = 0; i < N; i++)
		printf("%5d", a[i]);
    printf("\n");
}
